package mediatorPattern

/**
 * 中介者模式,也称调停者模式:
 * 用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示的互相作用,从而使其耦合松散,
 * 而且可以独立的改变它们之间的交互.
 *
 * 角色:
 * 抽象中介者(Mediator):定义对象到中介者对象的统一接口,用于各角色之间的通信
 * 具体中介者(Concrete Mediator):该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作
 * 抽象同事(Colleague):该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象
 * 具体同事(Concrete Colleague):每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的
 *
 * 优点:
 * 介绍类之间的依赖,将原有的一对多的依赖变成一对一的依赖,使对象之间的关系更易维护和理解.
 *
 * 注意:
 * 中介者模式很简单,但是简单不代表容易使用,它很容易被误用和滥用,在面向对象的编程中,对象和对象之间必然会有依赖
 * 关系,如果某个类和其他类没有任何互相依赖的关系,那这个类就是一个孤岛,在系统中就没有存在的意义.一个类依赖多个类
 * 的情况也是正常的.
 *
 * 示例:
 * 模拟婚姻中介所的工作过程
 *
 * 思考:中介者模式和门面模式的区别
 *
 * 门面模式类似于一种树状结构,最顶端的对象通过它依赖的若干类与这个世界沟通
 *
 * 中介模式类似于星状结构,中心就是中介者,每个对象都只依赖于中介者,通过中介者可以与每一个在中介者对象中注册(也就是依赖中介者的类)的对象沟通
 * 类似于手机打电话,拨号后电信中心会根据所拨打的号码进行匹配,匹配完成后拨通相应的号码,电信中心就类似于一个中介者
 */
fun main() {
    val marriageAgency = MarriageAgencyImpl()
    val missLi = Woman("李女士", 25, "找一个高大威猛的", marriageAgency)
    val mrZhang = Man("张先生", 28, "找一个年轻漂亮的", marriageAgency)

    mrZhang.findPartner()
    missLi.findPartner()
}